|
Date : 10 d�cembre 1993 Programme : VGACOPY V5.2 FRANCAIS Protection : MESSAGES de SHAREWARE Outils : SOFT-ICE V2.50 Temps pass� : 20 minutes Fichier : VGACOPY.EXE Soci�t� : SHAREWARE Divers : Compact� par PKLITE version PRO et le HEADER a �t� "scrambled". Origine : L.F. Num�ro : 233 Ici la prouesse n'�tait pas de diminuer le comptage du " SHAREWARE COUNTER " ni de modifier les diff�rents messages apparaissant � l'�cran mais plutot de d�compresser le fichier. L'auteur doit se m�fier des hackers car il a utilis� plusieurs types de compresseurs tout au long de ses versions: LZEXE, PKLITE 1.13, TZ etc... avec quelques fois des modifications des headers afin de d�jouer les d�compresseurs du commerce: DISLITE, PKUNLITE, et mon PKFRED. Le seul qui s'en sort avec prouesse c'est le d�compresseur UNP V3.10 qui est assez ph�nom�nal. Pour un peu je lui payerais sa license. Mais comme elle est tellement faible ( 5$ ) l'auteur pr�f�re du matoss. Pourquoi pas ? Je dois bien poss�der une vieille cafeti�re �lectronique � pompage mol�culaire. Revenons-en � VGACOPY V5.2: Ce programme excellent en VGA et SOUNDBLASTER devient p�nible avec sa tempo et son message de sortie vers le DOS. En visualisant le header on trouve que le fichier a �t� comprim� par PKLITE. J'utilise donc UNP qui trouve que le fichier... n'est pas comprim� ! Je me bas pendant plus de trois heures avec SOFT-ICE, UNP, PKFRED pour essayer de forcer la d�compression. NADA ! J'en conclu que le HEADER de VGACOPY a �t� volontairement modifi� pour tromper UNP. "Ils" l'ont bien fait avec VGA_READ.EXE ou les lettres LZ91 avaient �t� remplac� par autre chose. En lan�ant le programme avec LDR de SOFT-ICE ce dernier se plante ! Bravo. Un coup de plus. Mais en appellant SOFT-ICE normalement, une fois que le programme est d�comprim� en m�moire il fonctionne. Heureusement. La tempo est appell�e par la routine ci-dessous: CS=0EFF CS:50BD E85CBD CALL CS:50C0 E825CD CALL ; TEMPO ! CS:50C3 E8B4B2 CALL Il suffit d'y placer un JMP 50C3 autrement dit en ASM: EB01. Pourquoi pas trois NOP ? Parceque cel� me ferait trois instructions au lieu de deux avec le JMP. Et comme c'est plus facile de transferer un mot qu'un mot et un byte dans mon lanceur... Le message de fin est affich� par un CALLF appell� pour chaque ligne a afficher. On peut bien sur placer un RETF � la premi�re instruction du CALLF mais cel� ne me plait pas car il reste le cadre de l'affichage. En pla�ant un JMP par dessus tous ces CALLF cel� � l'air de fonctionner. CS=1591 CS:05B2 CALLF ; AFFICHE UNE LIGNE DU TEXTE SHAREWARE A CHAQUE APPEL. Le jump pardessus les CALLF doit se situer en CS:05B7 ou 05B8: CS:05B7 PUSH CS CS:05B8 E851 CALL ; affiche le cadre pour le texte. J'ai essay� les deux positions apparement sans PB ( malgr� le push suppl�mentaire ). Il faut donc placer en CS:05B8 un JUMP 07D3 qui prend trois octets. La je n'y coupe pas: E91802. Donc en CS:05B8 il faut remplacer E851 par E918 et remplacer le byte en 05BA par 02. Comme le programnme est ind�comprimable ( pour l'instant, car si j'offre un CRAY ONE � l'auteur de UNP, je pense qu'il m'arrangera �a ) je cr�e mon d�tourneur d'INT avec une double boucle vue que les deux modifications � effectuer ne se trouve pas dans le m�me segment CS. Je viens malgr� tout de trouver encore une nouvelle protection anti- modification du fichier VGACOPY.EXE: Lors du formattage de disquette sans copier, le programme quitte avec un petit message sournois ! A voir donc... control de CRC probablement. Nota: Le formattage d'une disquette lors d'une copie normale fonctionne. Voici le lanceur: ; PATCH POUR LE PROGRAMME VGACOPY V5.2 FRANCAIS. ; INT 10h. Pas de sous-fonction. ;****************************************************************************** ; ZONE A INITIALISER adr_ip1 equ 50c0h ; Adresse dont le contenu est � modifier. adr_ip2 equ 5b8h ; Seconde adresse. anc_val equ 25e8h ; Valeur d'origine � rechercher, invers�e. anc_val1 equ 51e8h ; Seconde valeur. nouv_val equ 01ebh ; Nouvelle valeur (la modif). nouv_val1 equ 18e9h ; Nouvelle seconde valeur. ;sous_f equ 3eh ; Sous-fonction 3E. INT_DET equ 10h ; Le num�ro de l'INT que l'on veut utiliser. BEEP_TONE equ 440 ; Fr�quence de la note. nb equ 30 ; Nombre de d�pilage. ;---------------------------- int d�tourn�e -------------------------------- int_entry proc far _int: jmp apres _SAUVE_SP dw 0,0 flag1 db 0 flag2 db 0 apres: push ax push ds push bx push cx push dx pushf ; Push flags ifdef sous_f cmp ah,sous_f jnz sort endif mov word ptr cs:[_SAUVE_SP],sp mov cx,nb prochain: pop ds dec cx jnz suit jmp s suit: cmp byte ptr cs:[flag1],1 jz patch2 cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche. jnz patch2 mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch. mov byte ptr cs:[flag1],1 ; Premier patch ok. cmp byte ptr cs:[flag2],1 ; Si second ok aussi jz tout_bon ; on quitte avec 3 bips patch2: cmp byte ptr cs:[flag2],1 jz prochain cmp word ptr ds:[adr_ip2],anc_val1 jnz prochain mov word ptr ds:[adr_ip2],nouv_val1 mov byte ptr ds:[adr_ip2+2],02 ; Donn�e supl�mentaire. mov byte ptr cs:[flag2],1 ; Second patch ok. cmp byte ptr cs:[flag1],1 jnz prochain tout_bon: xor bx,bx |